package com.wusiwei.mapper;

import com.wusiwei.entity.Invoice;
import com.wusiwei.entity.Order;
import com.wusiwei.entity.Receipt;
import com.wusiwei.entity.ThreeWayMatch;
import com.wusiwei.vo.MatchedOrderVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 三单匹配数据访问接口
 */
@Mapper
public interface MatchMapper {

    /**
     * 插入匹配记录
     *
     * @param match 匹配记录
     * @return 影响的行数
     */
    int insert(ThreeWayMatch match);

    /**
     * 更新匹配记录
     *
     * @param match 匹配记录
     * @return 影响的行数
     */
    int update(ThreeWayMatch match);

    /**
     * 根据ID删除匹配记录
     *
     * @param id 匹配记录ID
     * @return 影响的行数
     */
    int deleteById(Long id);

    /**
     * 根据ID查询匹配记录
     *
     * @param id 匹配记录ID
     * @return 匹配记录
     */
    ThreeWayMatch findById(Long id);

    /**
     * 查询所有匹配记录
     *
     * @return 匹配记录列表
     */
    List<ThreeWayMatch> findAll();

//    /**
//     * 查询所有匹配记录（包含详细信息）
//     *
//     * @return 匹配记录列表（包含订单、收货单、发票详细信息）
//     */
//    List<ThreeWayMatch> findAllWithDetails();

    /**
     * 根据订单ID、收货单ID、发票ID查询匹配记录
     *
     * @param orderId   订单ID
     * @param receiptId 收货单ID
     * @param invoiceId 发票ID
     * @return 匹配记录
     */
    ThreeWayMatch findByDocumentIds(@Param("orderId") Long orderId,
                                    @Param("receiptId") Long receiptId,
                                    @Param("invoiceId") Long invoiceId);

//    /**
//     * 根据条件查询匹配记录
//     *
//     * @param match 查询条件
//     * @return 匹配记录列表
//     */
//    List<ThreeWayMatch> findByCondition(ThreeWayMatch match);

//    /**
//     * 根据条件查询匹配记录
//     *
//     * @param condition 查询条件Map
//     * @return 匹配记录列表
//     */
//    List<ThreeWayMatch> findByConditionMap(Map<String, Object> condition);

//    /**
//     * 根据月份查询匹配记录
//     *
//     * @param month 月份，格式 yyyy-MM
//     * @return 匹配记录列表
//     */
//    List<ThreeWayMatch> findByMonth(@Param("month") String month);

//    /**
//     * 根据日期范围查询匹配记录
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 匹配记录列表
//     */
//    List<ThreeWayMatch> findByDateRange(@Param("startDate") LocalDate startDate,
//                                        @Param("endDate") LocalDate endDate);

//    /**
//     * 分页查询匹配记录
//     *
//     * @param params 查询参数
//     * @return 匹配记录列表
//     */
//    List<ThreeWayMatch> findByPage(Map<String, Object> params);

    /**
     * 分页查询匹配记录
     *
     * @param supplierName 供应商名称
     * @param matchResult  匹配结果
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @param offset       偏移量
     * @param pageSize     每页大小
     * @return 匹配记录列表
     */
    List<ThreeWayMatch> findByPage(@Param("supplierName") String supplierName,
                                   @Param("matchResult") String matchResult,
                                   @Param("startDate") Date startDate,
                                   @Param("endDate") Date endDate,
                                   @Param("offset") int offset,
                                   @Param("pageSize") int pageSize);

    /**
     * 统计匹配记录总数
     *
     * @param supplierName 供应商名称
     * @param matchResult  匹配结果
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 记录总数
     */
    int count(@Param("supplierName") String supplierName,
              @Param("matchResult") String matchResult,
              @Param("startDate") Date startDate,
              @Param("endDate") Date endDate);

    /**
     * 统计总记录数
     *
     * @return 总记录数
     */
    int countTotal();

    /**
     * 按匹配结果分组统计
     *
     * @return 统计结果列表
     */
    List<Map<String, Object>> countByMatchResult();

//    /**
//     * 按供应商统计匹配准确率
//     *
//     * @return 统计结果列表
//     */
//    List<Map<String, Object>> countMatchRateBySupplier();

    /**
     * 按月统计匹配趋势
     *
     * @return 统计结果列表
     */
    List<Map<String, Object>> countMatchTrendByMonth();

    /**
     * 查找可三单匹配的订单（未在三单匹配表中的订单）
     *
     * @param params 查询参数
     * @return 可匹配的订单列表
     */
    List<Order> findOrdersAvailableForMatch(Map<String, Object> params);

    /**
     * 统计可三单匹配的订单总数
     *
     * @param params 查询参数
     * @return 可匹配的订单总数
     */
    int countOrdersAvailableForMatch(Map<String, Object> params);

    /**
     * 查找已完成三单匹配的订单
     *
     * @param params 查询参数
     * @return 已匹配的订单列表
     */
    List<MatchedOrderVO> findMatchedOrders(Map<String, Object> params);

    /**
     * 统计已完成三单匹配的订单总数
     *
     * @param params 查询参数
     * @return 已匹配的订单总数
     */
    int countMatchedOrders(Map<String, Object> params);

    /**
     * 查找可与指定订单匹配的收货单
     *
     * @param orderId 订单ID
     * @return 可匹配的收货单列表
     */
    List<Receipt> findReceiptsForOrderMatch(@Param("orderId") Long orderId);

    /**
     * 查找可与指定订单匹配的发票
     *
     * @param orderId 订单ID
     * @return 可匹配的发票列表
     */
    List<Invoice> findInvoicesForOrderMatch(@Param("orderId") Long orderId);

    /**
     * 批量删除匹配记录
     *
     * @param ids 匹配记录ID列表
     * @return 影响的行数
     */
    //todo 未完成
    int batchDelete(@Param("ids") List<Long> ids);

    /**
     * 根据发票ID查询关联的订单
     *
     * @param invoiceId 发票ID
     * @return 订单列表
     */
    List<Order> findOrdersByInvoiceId(@Param("invoiceId") Long invoiceId);
} 